www.gusucode.com > LTE基带收发仿真系统matlab源码程序 > LTE baseband simulation/codeblock_segment.m
function c = codeblock_segment(b,iUE,iTB) % 功能:对已经添加CRC24A的数据b进行码块分割,并给分割后数据添加CRC24B % 参照36.212 V870 5.1.2 % 输入: % b:完成CRC24校验的数据 % iUE: 第i个用户 % iTB:第i个TB % 输出: % c:完成码块分割和CRC24B校验的数据 % % Author: 程式小组(徐萌 张妙 张晓庆) % Date: 2010-06-20 % =========================================================== global LTE_par load InLeaverPar % 载入Turbo编码内交织参数 inLeaverPar nBlockSize = size(inLeaverPar,1); % 总共nBlockSize种码块分割长度 Z = 6144; % 最大码块大小 B = length(b); if B <40 F = 40-B; c0 = NaN*ones(1,F); c = [c0,b]; C = 1; Ka = 40; Ca = 1; Kb = 0; Cb = 0; else if B <= Z L = 0; % 不添加CRC24B校验位 C = 1; % 不分割,码块长度为1 Bz = B; else L = 24; % CRC校验长度 C = ceil(B/(Z-L)); % 码块长度 Bz = B+C*L; end % 寻找K,满足C*K>=B' for k = 1:nBlockSize if inLeaverPar(k,1)*C >= Bz Ka = inLeaverPar(k,1); % 标准中的K+ break; end end % 如果C=0,不进行分块 if C == 1 Ca = 1; Kb = 0; Cb = 0; % 否则进行分块处理 elseif C>1 Kb = inLeaverPar(k-1,1); deltaK = Ka-Kb; Cb = floor((C*Ka-Bz)/deltaK); Ca = C-Cb; end c = cell(C,1); % 根据分得的块数,建立存储分块后的存储空间 % 计算填充比特大小,并对第一个块的前F个数据置空 F = Ca*Ka+Cb*Kb-Bz; if F>0 c0 = NaN*ones(1,F); end k = F+1; s = 1; for r = 1:C if r <= Cb Kr = Kb; else Kr = Ka; end c{r,1} = zeros(1,Kr); if(r == 1 && F>0) c{r,1}(1:F) = c0; % 存储填充比特 end while(k <= Kr-L) c{r,1}(k) = b(s); k = k+1; s = s+1; end if C>1 p = crc24b(c{r,1}(1:Kr-L)); while(k<=Kr) c{r,1}(k) = p(k+L-Kr); k = k+1; end end k = 1; end end LTE_par.UE_par.nCB(iTB,iUE) = C; LTE_par.UE_par.Ka(iTB,iUE) = Ka; LTE_par.UE_par.Ca(iTB,iUE) = Ca; LTE_par.UE_par.Kb(iTB,iUE) = Kb; LTE_par.UE_par.Cb(iTB,iUE) = Cb; % % ======================= 测试用 验证分块正确性 ===================== % for r = 1:C % if r < Cb % Kr = Kb; % else % Kr = Ka; % end % tt1 = 1+(r-1)*(Kr-24); % tt2 = r*(Kr-24); % re = sum(abs(b(tt1:tt2)-c{r,1}(1:end-24))); % tt1 = tt1+24; % tt2 = tt2+24; % disp('re') % disp(re) % end